//
//  WBNetworkManager.swift
//  Swift微博练习
//
//  Created by 练锦波 on 2016/12/20.
//  Copyright © 2016年 练锦波. All rights reserved.
//

import UIKit
import AFNetworking

// swift的枚举支持任意数据类型
enum WBHTTPMethod {
    case GET
    case POST
}

class WBNetworkManager: AFHTTPSessionManager {

    
    /// 静态区/常量/闭包
    
    /// 在第一次访问时，执行闭包，并且将结果保存在 shared 常量中
    static let shared = WBNetworkManager()
    
    // 访问令牌，所有网络请求，都基于此令牌（登陆除外）
    var accessToken : String? = "2.00oXO32E2cAyZE7aeeef7f3eOA367B"
    
    // 专门负责拼接 token 的网络请求方法
    func tokenRequest(method: WBHTTPMethod = .GET, URLString : String, parameters:[String : Any]?, completion:@escaping (_ json:Any?, _ isSuccess: Bool)->()) {
        
        // 处理token字典
        // 0>判断token是否为nil 为nil直接返回
        guard let token = accessToken else {
            // FIXME: 发送通知 提示用户登录
            print("没有token 需要登录")
            completion(nil, false)
            return
        }
        
        // 1>判断参数字典是否存在 如果为nil 应该新建一个字典
        var parameters = parameters
        if parameters == nil {
            // 实例化字典
            parameters = [String: Any]()
        }
        
        // 2>设置参数字典 代码在此处 字典一定有值
        parameters!["access_token"] = token
        
        // 调用request发起真正的网络请求方法
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
    
    // 使用一个函数封装 AFN的get/post请求
    
    func request(method: WBHTTPMethod = .GET, URLString : String, parameters:[String : Any]?, completion:@escaping (_ json:Any?, _ isSuccess: Bool)->()) {
       
        let success = { (task: URLSessionTask, json: Any?) ->() in
            
            completion(json, true)
        }
        
        let failure = { (task: URLSessionTask?, error: Error) ->() in
            
            // 针对 403 出来用户 过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token过期了")
                
                // FIXME: 发送通知(本方法不知道被谁调用,谁接收到通知，谁处理)
            }
            
            print("网络请求错误 \(error)")
            
            completion(nil, false)
        }
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
 
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
    
}
